package sifeap.bl.ejb.solicitudesauxilio;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import sifeap.bridge.VinculadosBridge;
import sifeap.dal.ejb.solicitudesauxilio.EstadoAuxilioDALLocal;
import sifeap.dal.ejb.solicitudesauxilio.SolicitudAuxilioDALLocal;
import sifeap.dal.ejb.soportes.SoporteDALLocal;
import sifeap.entities.solicitudesauxilio.EstadoAuxilio;
import sifeap.entities.solicitudesauxilio.SolicitudAuxilio;
import sifeap.entities.solicitudesauxilio.valueobject.SolicitudAuxilioVO;
import sifeap.entities.soportes.Soporte;
import sifeap.exception.SifeapException;

/**
 * Session Bean implementation class EventoBL
 */
@Stateless(name="SolicitudAuxilioBL")
public class SolicitudAuxilioBL implements SolicitudAuxilioBLLocal {

	@EJB
	private SolicitudAuxilioDALLocal solicitudAuxilioDAL;
	
	@EJB
	private SoporteDALLocal soporteDAL;
	
	@EJB
	private EstadoAuxilioDALLocal estadoAuxilioDAL;
	
    /**
     * Default constructor. 
     */
    public SolicitudAuxilioBL() {}

	@Override
	public List<SolicitudAuxilio> buscarTodos() throws SifeapException {
		try{
			return solicitudAuxilioDAL.buscarTodos();
		}catch (Exception e) {
			throw new SifeapException(e);
		}
	}

	@Override
	public SolicitudAuxilio buscar(Object id) throws SifeapException {
		try {
			return solicitudAuxilioDAL.buscar(id);
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}

	@Override
	public byte crear(SolicitudAuxilio solicitudAuxilio) throws SifeapException {
		List<Soporte> listaSoportes = null;
		if (solicitudAuxilio.getSoportes() != null) {
			listaSoportes = new ArrayList<Soporte>(solicitudAuxilio.getSoportes());
			solicitudAuxilio.setSoportes(null);
		}
		
		//Crea la solicitud
		solicitudAuxilioDAL.crear(solicitudAuxilio);

		crearSoportes(solicitudAuxilio.getIdSolicitudAuxilio(), listaSoportes);
		
		return 1;
	}

	@Override
	public byte modificar(SolicitudAuxilio solicitudAuxilio) throws SifeapException {
		try {
			//Consulta los soportes de la solicitud
			List<Soporte> listaSoportes = soporteDAL.buscarSoportesSolicitudAuxilio(solicitudAuxilio.getIdSolicitudAuxilio());
			
			//Elimina los registros asociados
			boolean resultado = solicitudAuxilioDAL.eliminarRegistrosAsociados(solicitudAuxilio.getIdSolicitudAuxilio());
			
			//Elimina los soportes
			if (resultado && listaSoportes != null) {
				for (Soporte soporte : listaSoportes) {
					soporteDAL.eliminar(soporte);
				}
			}
			
			listaSoportes = null;
			if (solicitudAuxilio.getSoportes() != null) {
				listaSoportes = new ArrayList<Soporte>(solicitudAuxilio.getSoportes());
				solicitudAuxilio.setSoportes(null);
			}
			
			//Crea la solicitud
			solicitudAuxilioDAL.modificar(solicitudAuxilio);

			crearSoportes(solicitudAuxilio.getIdSolicitudAuxilio(), listaSoportes);
			
			return 1;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}

	@Override
	public boolean eliminar(SolicitudAuxilio solicitudAuxilio) throws SifeapException {
		try {
			solicitudAuxilioDAL.eliminar(solicitudAuxilio);
			return true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}

	@Override
	public boolean remover(SolicitudAuxilio solicitudAuxilio) throws SifeapException {
		try {
			solicitudAuxilioDAL.remover(solicitudAuxilio);
			return true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}
	
	@Override
	public List<EstadoAuxilio> buscarEstadosAuxilio() throws SifeapException {
		try{
			return estadoAuxilioDAL.buscarTodos();
		}catch (Exception e) {
			throw new SifeapException(e);
		}
	}
	
	@Override
	public List<SolicitudAuxilio> buscarMisSolicitudes(SolicitudAuxilioVO solicitudAuxilioVo) throws SifeapException {
		try {
			return solicitudAuxilioDAL.buscarSolicitudes(solicitudAuxilioVo, true);
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}
	
	@Override
	public boolean cambiarEstadoSolicitud(long idSolicitudAuxilio, Long estadoAuxilio, String comentario) throws SifeapException {
		try {
			solicitudAuxilioDAL.cambiarEstadoSolicitud(idSolicitudAuxilio, estadoAuxilio, comentario);
			return true;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}
	
	private void crearSoportes(long idSolicitudAuxilio, List<Soporte> listaSoportes) throws SifeapException {
		if (listaSoportes != null) {
			for (Soporte soporte : listaSoportes) {
				try {
					//Llama el valor de la secuencia
					soporteDAL.crear(soporte);

					//Debe insertar en SOPORTESAUXILIO
					solicitudAuxilioDAL.asociarSoportesAuxilio(idSolicitudAuxilio, soporte.getIdSoporte());
				} catch (Exception e) {
					throw new SifeapException(e);
				}
			}
		}
	}

	@Override
	public List<SolicitudAuxilioVO> buscarSolicitudesGestionadas(SolicitudAuxilioVO solicitudAuxilioVo) throws SifeapException {
		try {
			List<SolicitudAuxilioVO> listaSolicitudesVo = null;
			List<SolicitudAuxilio> listaSolicitudes = solicitudAuxilioDAL.buscarSolicitudes(solicitudAuxilioVo, false);
			
			if (listaSolicitudes != null) {
				listaSolicitudesVo = new ArrayList<SolicitudAuxilioVO>();
				SolicitudAuxilioVO solCredVo;
				for (SolicitudAuxilio solicitudAuxilio : listaSolicitudes) {
					solCredVo = new SolicitudAuxilioVO();
					
					//Debe buscar el vinculado por cedula
					solCredVo.setAsociado(new VinculadosBridge().buscarPorCedula(solicitudAuxilio.getVincedula()));
					
					solCredVo.setSolicitudAuxilio(solicitudAuxilio);
					listaSolicitudesVo.add(solCredVo);
				}
				
			}
			
			return listaSolicitudesVo;
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}

	@Override
	public void cambiarEstadoSolicitudes(List<SolicitudAuxilioVO> listaSolicitudes) throws SifeapException {
		for (SolicitudAuxilioVO solicitudAuxilio : listaSolicitudes) {
			
			//Evalua si el estado nuevo no es nulo y si el estado anterior es "En estudio"
			if (solicitudAuxilio.getNuevoEstado() != null && solicitudAuxilio.getSolicitudAuxilio().getEstadosauxilio().getIdEstadoAuxilio() == 3) {
				if (solicitudAuxilio.getNuevoEstado() != 6) {
					solicitudAuxilio.getSolicitudAuxilio().setComentario(null);
				}
				cambiarEstadoSolicitud(solicitudAuxilio.getSolicitudAuxilio().getIdSolicitudAuxilio(), solicitudAuxilio.getNuevoEstado(), solicitudAuxilio.getSolicitudAuxilio().getComentario());
			}
		}
	}
	
	@Override
	public SolicitudAuxilio buscarUltimoAuxilioAprobado(String cedula, Long idTipoAuxilio) throws Exception {
		try {
			return solicitudAuxilioDAL.buscarUltimoAuxilioAprobado(cedula, idTipoAuxilio);
		} catch (Exception e) {
			throw new SifeapException(e);
		}
	}
}
